home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / utilities / misc / stool15.lha / STool / src / stool.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-12-09  |  3.7 KB  |  188 lines

  1. /* Screentool */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <proto/exec.h>
  7. #include <proto/dos.h>
  8. #include <proto/graphics.h>
  9. #include <proto/intuition.h>
  10. #include <exec/memory.h>
  11. #include <intuition/intuitionbase.h>
  12.  
  13. #include "version.h"
  14.  
  15. struct IntuitionBase *IntBase;
  16.  
  17. CHARVERSTAG;
  18.  
  19. struct SToolArgs {
  20.   UBYTE **Screen;
  21.   LONG List,ToFront,ToBack,Constring,Winsize;
  22. };
  23.  
  24. char *NOTAPP = "n/a";
  25.  
  26. char *Template = "SCREEN/M,LIST=L/S,TOFRONT=F/S,TOBACK=B/S,CONSTRING=C/S,WINSIZE=W/S";
  27.  
  28. char *Options[] = {
  29.     "screentitle or pattern (casesensitive!)",
  30.     "list screens",
  31.     "bring object to front",
  32.     "send object to back",
  33.     "windowsize as CON:-like string",
  34.     "windowsize as info-string"
  35. };
  36. char *Errlist[] = {
  37.     "TOFRONT only valid with SCREEN.",
  38.     "LIST not valid with SCREEN. Use patterns instead.",
  39.     "TOFRONT or TOBACK, there could only be ONE.",
  40.     "TOFRONT / TOBACK not valid with LIST.",
  41.     "n/a"
  42. };
  43.  
  44. char ProgName[80];
  45.  
  46. void Help(int err) 
  47. {
  48.   if (!err) {
  49.     char *p,**o;
  50.     o=&Options[0];
  51.     Printf("Usage:\n%s %s\n",ProgName,Template);
  52.     for (p=strtok(Template,",");p;p=strtok(NULL,","))
  53.         Printf("  %s\t%s\n",p,*o++);
  54.   }
  55.   else
  56.     Printf("Error: %s\n",Errlist[err-1]);
  57. }
  58.  
  59.  
  60. void DumpScreen(struct Screen *scr)
  61. {
  62.     UBYTE *s;
  63.     ULONG m;
  64.     s=NOTAPP;
  65.     if (scr->Title) {
  66.         s=scr->Title;
  67.         Printf("Title: \"%s\"\n",s);
  68.     }
  69.     if (scr->DefaultTitle) s=scr->DefaultTitle;
  70.     if (scr->Title != s) 
  71.         Printf("DefaultTitle: \"%s\"\n",s);
  72.     m=GetVPModeID(&scr->ViewPort);
  73.     Printf("%ldx%ld",(long)scr->Width,(long)scr->Height);
  74.     Printf("x%ld",scr->RastPort.BitMap->Depth);
  75.     Printf(" Mode: 0x%lx",m);
  76.     Printf(" @(%ld,%ld)\n\n",scr->LeftEdge,scr->TopEdge);
  77. }
  78.  
  79.  
  80. LONG __saveds main(void)
  81. {
  82.   struct Window *win;
  83.   struct Screen *scr;
  84.   struct Screen *scr_p;
  85.   UBYTE *s;
  86.   UBYTE **ScreenName;
  87.  
  88.   UBYTE *patbuf;
  89.   int ret;
  90.  
  91.   struct RDArgs *RDArgs;
  92.   struct SToolArgs Args = {0}; // everything will be FALSE
  93.  
  94.   if (!GetProgramName(ProgName,(long)sizeof(ProgName))) (void)strcpy(ProgName,VERS);
  95.  
  96.   if ((RDArgs=ReadArgs(Template,(LONG *)&Args,NULL))==NULL) {
  97.     PrintFault (IoErr(),ProgName);
  98.     exit(1);
  99.   }
  100.   ScreenName = Args.Screen;
  101.  
  102.   ret = 0;
  103.   if (!(ScreenName || 
  104.         Args.List ||
  105.         Args.ToFront ||
  106.           Args.ToBack ||
  107.         Args.Constring ||
  108.         Args.Winsize)) {
  109.     FreeArgs (RDArgs);
  110.     Help(0);
  111.     exit(0);
  112.   }
  113.  
  114.   if (!ScreenName && Args.ToFront) ret = 1;
  115.   else
  116.   if (Args.ToFront && Args.ToBack) ret = 2;
  117.   else
  118.   if (Args.List && (Args.ToFront || Args.ToBack)) ret = 3;
  119.  
  120.   if (ret) {
  121.     FreeArgs (RDArgs);
  122.     Help(1);
  123.     exit(0);
  124.   }
  125.  
  126.   patbuf = NULL;
  127.   if (ScreenName) {
  128.     LONG ret;
  129.     LONG patsiz;
  130.     patsiz = strlen(*ScreenName)*2+20;
  131.     if (!(patbuf = AllocVec(patsiz,MEMF_PUBLIC))) {
  132.         FreeArgs (RDArgs);
  133.         PrintFault(IoErr(),ProgName);
  134.         exit(10);
  135.     }
  136.     ret = ParsePattern(*ScreenName,patbuf,patsiz);
  137.     if (ret==-1) {
  138.         FreeVec(patbuf);
  139.         FreeArgs (RDArgs);
  140.         PrintFault(IoErr(),ProgName);
  141.         exit(10);
  142.     }
  143.   }
  144.  
  145.   win = IntuitionBase->ActiveWindow;
  146.   scr = IntuitionBase->FirstScreen;
  147.  
  148.   if (ScreenName || Args.ToFront || Args.ToBack || Args.List) {
  149.     scr_p = scr;
  150.     while (scr_p) {
  151.       s="n/a";
  152.       if (scr_p->DefaultTitle) s=scr_p->DefaultTitle;
  153.       if (scr_p->Title) s=scr_p->Title;
  154.       if (Args.List && !patbuf) {
  155.         DumpScreen(scr_p);
  156.       }
  157.       if (patbuf)
  158.         if (MatchPattern(patbuf,s)) {
  159.             if (Args.List) {
  160.                 DumpScreen(scr_p);
  161.             }
  162.             if (Args.ToFront) {
  163.                 ScreenToFront(scr_p);
  164.                 break;
  165.             }
  166.             else
  167.             if (Args.ToBack) {
  168.                 ScreenToBack(scr_p);
  169.                 break;
  170.             }
  171.         } 
  172.       scr_p=scr_p->NextScreen;
  173.     }
  174.   }
  175.  
  176.  
  177.   if (Args.Winsize) { // this ones from WinSize
  178.     Printf ("Window Position: %d x %d , Size: %d x %d\n",win->LeftEdge,win->TopEdge,win->Width,win->Height);
  179.   }
  180.  
  181.   if (Args.Constring) { // this 2
  182.     Printf ("%d/%d/%d/%d/",win->LeftEdge,win->TopEdge,win->Width,win->Height);
  183.   }
  184.  
  185.   if (patbuf) FreeVec(patbuf);
  186.   FreeArgs (RDArgs);
  187. }
  188.